﻿function Barco(juego, angle, speed, x, y, imagen, tipo) {    
    Objeto.call(this, juego, x, y);
    this.sprite = MANEJADOR_RECURSOS.getAsset(imagen);
    this.radius = this.sprite.width / 2;

    this.angle = angle;
    this.speed = speed;

    this.rx = x * juego.tileSize;
    this.ry = y * juego.tileSize; 

    this.ismoving = false;
    this.accionActiva = null;
    this.tipoObjeto = tipo;
   
}
Barco.prototype = new Objeto();
Barco.prototype.constructor = Barco;

Barco.prototype.move = function (coords, callback) {        
        this.callback = callback;
        //console.log("asigno callback");
        var actualMove = coords;   
        
        //calculo la distancia (h2 = a2 + b2)
        var dx = (actualMove.x * 32) - this.rx;
        var dy = (actualMove.y * 32) - this.ry;
        var distance = Math.sqrt(dx * dx + dy * dy);
        //calculo cuantos movimientos tengo que hacer para esa distancia a mi velocidad
        this.moves = distance / this.speed;
        //calculo cuantas unidades me muevo en el eje x e y para la cantidad de movimientos que tengo
        this.xunits = dx / this.moves;
        this.yunits = dy / this.moves;

        //actualizao coordenadas del barco
        this.x = actualMove.x;
        this.y = actualMove.y;

        //marcador de movimiento
        //this.ismoving = true;   
}

Barco.prototype.rotate = function (grados, callback) {
    this.callback = callback;
    if(this.rotMoves <= 0 || this.rotMoves == null){
        this.rotMoves = Math.abs(grados / this.speed);   
        this.aunits = grados / this.rotMoves;
    }      
}

Barco.prototype.disparar = function(point, callback){
    var bala = new Bala(this.juego, this.x, this.y, point, callback);
    this.juego.agregarObjeto(bala);    
}

Barco.prototype.explotar = function () {
    this.removeFromWorld = true;
    this.juego.agregarObjeto(new Explocion(this.juego, this.x, this.y));
    this.barco = null;
}

Barco.prototype.update = function () {
    if(this.rotMoves > 0){
        this.rotMoves--;
        this.angle += this.aunits;
    }
    if (this.moves > 0) {        
        this.moves--;
        this.rx += this.xunits;
        this.ry += this.yunits;        
    }    

    
    if(this.moves <= 0){
        if(this.callback){            
            this.callback(this);           
        }
        //this.ismoving = false; 
    }
    else if(this.rotMoves <= 0){
        if(this.callback){            
            this.callback(this);           
        }       
    }

    Objeto.prototype.update.call(this);
}

Barco.prototype.draw = function (ctx) {   

    //dibujo el area de movimientos
    if(!this.juego.actualizando && 
        parseInt(this.juego.accionActiva) == parseInt(TipoAccion.MOVERSE) && 
        parseInt(this.juego.tipoBarco) == parseInt(this.tipoObjeto)){
        var area = this.obtenerAreaMovimiento();
        this.dibujarArea(area, "white");
    }
    //dibujo area de disparo
    if(!this.juego.actualizando && this.juego.accionActiva == TipoAccion.DISPARAR && this.juego.tipoBarco == this.tipoObjeto){
        var area = this.obtenerAreaDisparo(this.juego.stats.barco.alcanceTiro);
        this.dibujarArea(area, "yellow");
    }

    if(this.esVisible()){
        ctx.save();
        ctx.translate(this.rx  + 16 , this.ry + 16);
        ctx.rotate(Math.PI / 180 * this.angle);
        ctx.drawImage(this.sprite, -16, -16);       
        ctx.restore();
    }        

    Objeto.prototype.draw.call(this, ctx);
}

Barco.prototype.dibujarArea = function(area, color){
    for(var i = 0; i < area.length; i++){            
        ctx.beginPath();
        ctx.strokeStyle = color;
        ctx.rect(this.juego.tileSize * area[i].x, this.juego.tileSize * area[i].y, this.juego.tileSize, this.juego.tileSize);
        ctx.stroke();
    }   
}

Barco.prototype.esVisible = function(){
    var visible = false;
    for(var i = this.juego.barco.x - this.juego.visibilidad; i <= this.juego.barco.x + this.juego.visibilidad; i++ ){
        for(var j = this.juego.barco.y - this.juego.visibilidad; j <= this.juego.barco.y + this.juego.visibilidad; j++){         
                if(this.x == i && this.y == j){
                    visible = true;
                    break;
                }
            }
        }
    
    return visible;
}

Barco.prototype.obtenerAreaDisparo = function(casillas){
    var tiles = [];
    
    var xDesde, xHasta;
    var yDesde, yHasta;

    var angulo = this.juego.stats.barco.angulo;
    switch(angulo){
        case 0:
            xDesde = this.x - casillas;
            xHasta = this.x + casillas;
            yDesde = this.y - casillas;
            yHasta = this.y;
            break;
        case 90:
            xDesde = this.x;
            xHasta = this.x + casillas;
            yDesde = this.y - casillas;
            yHasta = this.y + casillas;
            break;
        case 180:
            xDesde = this.x - casillas;
            xHasta = this.x + casillas;
            yDesde = this.y;
            yHasta = this.y + casillas;
            break;
        case 270:
            xDesde = this.x - casillas;
            xHasta = this.x;
            yDesde = this.y - casillas;
            yHasta = this.y + casillas;
            break;
    }

    for(var i = xDesde; i <= xHasta; i++ ){
        for(var j = yDesde; j <= yHasta; j++){            
            tiles.push({ x: i, y: j });            
        }
    }

    return tiles;
}

Barco.prototype.obtenerAreaMovimiento = function(ctx){
    var tiles = [];
    for(var i = this.x - this.juego.movimientos; i <= this.x + this.juego.movimientos; i++ ){
        for(var j = this.y - this.juego.movimientos; j <= this.y + this.juego.movimientos; j++){   
            
            //var dist = Math.sqrt(Math.pow(this.x - i, 2) + Math.pow(this.y - j, 2));
            if(//dist <= this.juego.movimientos &&
                 i < 25 && j < 25 && i >= 0 && j >= 0
                && tileMap[j][i] == 164)
            {
                tiles.push({ x: i, y: j });
            }
        }
    }   

    return tiles;
}

